package jmine.tec.hydra.api;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import jmine.tec.hydra.domain.HydraSystem;
import jmine.tec.hydra.domain.message.HydraConversation;
import bancosys.tec.persist.Persistable;
import bancosys.tec.utils.date.Timestamp;

/**
 * Representa uma mensagem de comunicação entre sistemas integrados.
 * 
 * @author marco.vieira
 */
public interface HydraMessage extends Persistable {

    /**
     * @return ida da mensagem.
     */
    Long getId();

    /**
     * Retorna o input da mensagem
     * 
     * @return input stream
     */
    InputStream getBody();

    /**
     * @return o corpo da mensagem com o charset default definido no sistema legado.
     * @throws IOException IOException
     */
    String getBodyAsString() throws IOException;

    /**
     * @param charsetName charsetName
     * @return corpo da mensagem.
     * @throws IOException IOException
     */
    String getBodyAsString(String charsetName) throws IOException;

    /**
     * @return conversa a qual a mensagem pertence.
     */
    HydraConversation getConversation();

    /**
     * @return sistema ao qual a mensagem está sendo enviada.
     */
    HydraSystem getSystem();

    /**
     * @return data/hora em que a mensagem foi criada.
     */
    Timestamp getTimestamp();

    /**
     * Obtém as propriedades da mensagem.
     * 
     * @return map de String para String
     */
    Map<String, String> getProperties();

    /**
     * @param hydraConversation conversa ao qual a mensagem está associada.
     */
    void setConversation(HydraConversation hydraConversation);

    /**
     * @return ação associada a mensagem.
     */
    String getAction();

    /**
     * @return MessageDirection
     */
    MessageDirection getDirection();

    /**
     * Associa a mensagem à requisição
     * 
     * @param request request
     */
    void setRequest(HydraRequest request);
}